swing为什么Java中的侦听器相互依赖?
我写过扫雷游戏。因为我有两个监听器作为一个按钮
class SampleClass extends MouseAdapter implements ActionListener {
//Some code here
public void actionPerformed(ActionEvent event){ // Buttons listener..
System.out.println("I came here to actionPerformed.");
//Some Code
}
public void mouseClicked(MouseEvent event) { //Mouse listener..
System.out.println("I came here to MouseClicked.");
//Some Code
if(event.getButton() == MouseEvent.BUTTON3){..}//If Right Mouse Button Is Clicked!!
else if(event.getButton() == MouseEvent.BUTTON1){..}//If Left Mouse Button Is Clicked!!
}
}
我观察到的是,每当单击鼠标左键时,只会调用执行的操作,而不会单击鼠标。但只要单击鼠标右键,就会调用mouseClicked(与正常情况一样,不会调用actionPerformed)
但是,当我移除ActionListener时,在上同时单击鼠标左键和右键的,mouseClicked被称为,工作非常正常
我想,两个监听器应该是两个不同的独立线程,监听事件,但是为什么一个依赖于另一个呢强>
# 1 楼答案
AWT的
MouseListener
和MouseMotionListener
处理有时行为非常奇怪。 但正如我所认为的,事件不应该相互干扰如果组件没有鼠标侦听器 然后将鼠标事件提升到父容器。这意味着你 可以不必监听父组件,但仍然可以接收 为所有孩子举办的活动。在上面的用例中,如果其他一些代码向子组件添加鼠标侦听器,那么鼠标事件将不会冒泡到父容器。 这真是个糟糕的设计
当且仅当我正在编写JComponent或PL&;的子类时,我更喜欢使用鼠标侦听器;F,因为它们可以被其他事件侦听器覆盖。我猜这就是你的情况。一个建议是使用符合你目的的EventQueue
# 2 楼答案
没有两个侦听器互不依赖。如果按下
space bar
,或调用doClick
或通过鼠标的left click
按下Action
,则JButton
的属性是触发Action
。这就是为什么当您用鼠标左键按JButton
时,但在调用actionPerformed
之前,默认情况下会调用actionperformed
(假定ActionListener
已向它注册),会调用mousePressed
事件。并且在ActionListener
未向JButton
注册的情况下,MouseEvent
起作用并执行所需的操作。两个侦听器彼此独立工作。事实上,操作是按正确的顺序触发的。。例如JButton
如果ActionListener和MouseStener都已注册。。然后触发的操作顺序如下所示:此代码将使您清楚地了解以下几点:
单击JButton可获得以下输出: